﻿//游游的字⺟串（枚举）
//https://ac.nowcoder.com/acm/problem/255195

//暴力,遍历所有字母，每次求变换和，保存最小结果
//#include<iostream>
//#include<string>
//
//using namespace std;
//
//int main()
//{
//    string s;
//    cin >> s;
//    int ret = 0x3f3f3f3f;
//    for (char ch = 'a'; ch <= 'z'; ch++)
//    {
//        int sum = 0;
//        for (auto x : s)
//        {
//            sum += min(abs(ch - x), 26 - abs(ch - x));
//        }
//        ret = min(ret, sum);
//    }
//    cout << ret << endl;
//
//    return 0;
//}


//体育课测验(⼆)（拓扑排序）
https://www.nowcoder.com/practice/64a4c026b2aa4411984f560deec36323?tpId=196&tqId=40272&ru=/exam/oj

//拓扑排序
//1.建图 (二维数组记录所有边, 各节点度数)
//2.把入度为零的点加进队列
//3.层序遍历,记录可到达的点入度--,如果减到零,加进队列
//4.判断可到达的点==点的总数

//#include<vector>
//#include<queue>
//using namespace std;

//class Solution {
//public:
//    vector<int> findOrder(int n, vector<vector<int> >& groups) {
//        vector<vector<int>>edges(n);//边
//        vector<int>in(n);//入度为0的节点
//
//        //建图
//        for (auto v : groups)
//        {
//            int a = v[1], b = v[0];//a->b
//            edges[a].push_back(b);
//            in[b]++;
//        }
//
//        //入度为0的点入队列
//        queue<int>q;
//        for (int i = 0; i < n; i++)
//        {
//            if (in[i] == 0)
//                q.push(i);
//        }
//
//        //拓扑排序
//        vector<int> ret;
//        while (q.size())
//        {
//            int a = q.front(); q.pop();
//            ret.push_back(a);
//            for (auto b : edges[a])//a->b
//            {
//                if (--in[b] == 0)
//                    q.push(b);//入度为0的点入队列
//            }
//        }
//        if (ret.size() == n)
//            return ret;
//        else
//            return {};
//    }
//};